package dao.hibernate;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import domain.Page;


public interface Dao<T> {
	/***
	 * 保存
	 * @param entity 实体对象
	 */
	public abstract void add(T entity);
	
	/***
	 * 删除
	 * @param entityId 实体对象id
	 */
	public abstract void delete(Serializable... entityId);
	
	/***
	 * 更新
	 * @param entity 一个投管或游离得实体对象
	 */
	public abstract void update(T entity);
	
	/***
	 * 根据id获得实体对象
	 * @param entityId 实体对象id
	 * @return 实体对象
	 */
	public abstract T get(Serializable entityId);
	
	/***
	 * 获得表总记录行数
	 * @return 记录行数
	 */
	public abstract Long getCount();
	
	/***
	 * 根据hql来查找
	 * @param hql hql语句
	 * @param param hql参数
	 * @return list的实体对象
	 */
	public abstract List<T> findByHql(String hql,Object... param);
	
	
	/***
	 * 根据hql来查找，且只返回第一行记录
	 * @param hql hql语句
	 * @param param hql参数
	 * @return list的实体对象
	 */
	public abstract T getByHql(String hql,Object... param);
	
	/***
	 * 根据hql来查找，且只返回第一行第一列记录
	 * @param hql
	 * @param param
	 * @return
	 */
	public abstract Object getFirstResult(String hql,Object... param);
	/***
	 * 查询表中所有得数据
	 * @return
	 */
	public abstract List<T> findAll();
	
	/***
	 *  分页查询
	 * @param page 一个页码配置bean
	 * @return 页码配置bean
	 */
	public abstract Page<T> findByPage(Page<T> page);
	
	/***
	 * 增删改语句执行
	 * @param hql hql语句
	 * @param param hql参数
	 */
	public abstract void execute(String hql,Object... param);
	
	/***
	 * 更新表数据
	 * @param datas 字段名与数据的键值对
	 * @param whereSql where条件，不带where,且占位的索引应接着datas的个数一直累加，请切记
	 * @param whereParams 与where条件相对应的值
	 */
	public void updateByHql(Map<String, Object> datas, String whereSql, Object[] whereParams);

	
	/****
	 * 根据id来更新表数据
	 * @param datas
	 * @param id
	 */
	public void updateById(Map<String, Object> datas, Serializable id);
	
	
	
}